package com.leetcode.offer;

import com.leetcode.entity.ListNode;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

/**
 * @author zfl
 * @Classname ReversePrint
 * @Description 从头到尾打印链表
 * @Date 2020/10/17 14:37
 */
public class ReversePrint {

    /**
     * @param head
     * @return
     * 执行用时：4 ms, 在所有 Java 提交中击败了5.83%的用户
     * 内存消耗：38.6 MB, 在所有 Java 提交中击败了99.87%的用户
     * 用到了流可能导致运算速度较慢
     */
    public static int[] reversePrint(ListNode head) {
        ListNode node = head;
        int count = 0;
        List<Integer> list = new LinkedList<Integer>();
        while (node != null) {
            list.add(0,node.val);
            count++;
            node = node.next;
        }
        // 将List转化为Integer[],再将Integer[]转化为int[]
        return Arrays.stream(list.toArray(new Integer[count])).mapToInt(Integer::valueOf).toArray();
    }

    /**
     * @param head
     * @return
     * 执行用时：1 ms, 在所有 Java 提交中击败了73.11%的用户
     * 内存消耗：38.5 MB, 在所有 Java 提交中击败了99.88%的用户
     */
    public static int[] reversePrint2(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode temp = head;
        while (temp != null) {
            stack.push(temp);
            temp = temp.next;
        }
        int size = stack.size();
        int[] print = new int[size];
        for (int i = 0; i < size; i++) {
            print[i] = stack.pop().val;
        }
        return print;
    }
}
